package com.campus.secondhand.service;

import java.util.List;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.web.multipart.MultipartFile;

import com.campus.secondhand.common.Result;
import com.campus.secondhand.entity.Product;
import com.campus.secondhand.entity.ProductImages;
import com.campus.secondhand.model.dto.ProductCreateDTO;
import com.campus.secondhand.model.dto.ProductSearchDTO;
import com.campus.secondhand.model.dto.ProductUpdateDTO;
import com.campus.secondhand.model.vo.ProductDetailVO;
import com.campus.secondhand.model.vo.ProductListVO;
import com.campus.secondhand.model.vo.ProductImageVO;

/**
 * 商品服务接口
 */
public interface ProductService {

        /**
         * 获取商品列表
         * 
         * @param categoryId    分类ID
         * @param schoolId      学校ID
         * @param keyword       搜索关键词
         * @param minPrice      最低价格
         * @param maxPrice      最高价格
         * @param sortField     排序字段：price、createdAt、views
         * @param sortOrder     排序方式：asc、desc
         * @param longitude     经度（用于计算距离）
         * @param latitude      纬度（用于计算距离）
         * @param pageable      分页参数
         * @param currentUserId 当前用户ID（可选，用于判断是否收藏）
         * @return 商品列表分页结果
         */
        Result<Page<ProductListVO>> getProductList(Long categoryId, Long schoolId, String keyword,
                        Double minPrice, Double maxPrice, String sortField,
                        String sortOrder, Double longitude, Double latitude,
                        Pageable pageable, Long currentUserId);

        /**
         * 获取商品详情
         * 
         * @param id     商品ID
         * @param userId 当前用户ID（可选，用于判断是否收藏）
         * @return 商品详情
         */
        Result<ProductDetailVO> getProductDetail(Long id, Long userId);

        /**
         * 发布商品
         * 
         * @param userId    用户ID
         * @param createDTO 商品创建DTO
         * @return 创建结果，包含商品ID
         */
        Result<Long> createProduct(Long userId, ProductCreateDTO createDTO);

        /**
         * 更新商品
         * 
         * @param id        商品ID
         * @param userId    用户ID
         * @param updateDTO 商品更新DTO
         * @return 更新结果
         */
        Result<Void> updateProduct(Long id, Long userId, ProductUpdateDTO updateDTO);

        /**
         * 删除商品
         * 
         * @param id     商品ID
         * @param userId 用户ID
         * @return 删除结果
         */
        Result<Void> deleteProduct(Long id, Long userId);

        /**
         * 修改商品状态
         * 
         * @param id     商品ID
         * @param userId 用户ID
         * @param status 商品状态：on_sale、sold、off_shelf
         * @return 状态更新结果
         */
        Result<Void> updateProductStatus(Long id, Long userId, String status);

        /**
         * 获取用户发布的商品
         * 
         * @param userId   用户ID
         * @param pageable 分页参数
         * @return 商品列表
         */
        Result<Page<ProductListVO>> getUserProducts(Long userId, Pageable pageable);

        /**
         * 上传商品图片
         * 
         * @param userId 用户ID
         * @param file   图片文件
         * @return 图片URL
         */
        Result<String> uploadProductImage(Long userId, MultipartFile file);

        /**
         * 增加商品浏览量
         * 
         * @param id 商品ID
         * @return 更新后的浏览量
         */
        Result<Integer> increaseProductViews(Long id);

        /**
         * 获取商品图片列表
         * 
         * @param productId 商品ID
         * @return 商品图片列表
         */
        Result<List<ProductImageVO>> getProductImages(Long productId);

        /**
         * 获取热门商品列表（浏览次数超过100的商品）
         * 
         * @param pageable 分页参数
         * @return 热门商品列表分页结果
         */
        Result<Page<ProductListVO>> getPopularProducts(Pageable pageable);

        /**
         * 获取附近商品列表
         * 
         * @param longitude 经度
         * @param latitude  纬度
         * @param radius    搜索半径（米）
         * @param limit     返回数量限制
         * @return 附近商品列表
         */
        Result<List<ProductListVO>> getProductsNearby(Double longitude, Double latitude, Integer radius, Integer limit);

        /**
         * 联系卖家
         * 
         * @param productId 商品ID
         * @param userId    用户ID
         * @param message   联系消息
         * @return 联系结果
         */
        Result<?> contactSeller(Long productId, Long userId, String message);

        /**
         * 获取推荐商品列表
         * 
         * @param categoryId 分类ID（可选，如有则推荐同分类商品）
         * @param userId     用户ID（可选，如有则根据用户浏览历史推荐）
         * @param limit      返回数量限制
         * @param pageable   分页参数
         * @return 推荐商品列表分页结果
         */
        Result<Page<ProductListVO>> getRecommendedProducts(Long categoryId, Long userId, Integer limit,
                        Pageable pageable);

}